闲扯
刚学斜率 $DP$ ,做了两道例题,感觉有点感觉了,还不错。
这是我第一道没看题解自己做出来的题,写篇题解记录一下。
题面
Solution
先考虑朴素 $DP$ 。
我们可以比较简单的推出以下方程:
- $ dp_i=\min_{j=0}^{i-1}(dp_j+a(sum_i-sum_j)^2+b(sum_i-sum_j)+c)$
如果直接枚举,复杂度是 $\frac{n^2}{2}$ 的,对于本题一定会 $TLE$ 。
考虑怎么优化。
先将原式中的括号全部打开,得到下面的式子:
- $ dp_i=\min_{j=0}^{i-1}(dp_j+a\cdot sum_i^2-2a\cdot sum_j\cdot sum_i+a\cdot sum_j^2+b\cdot sum_i-b\cdot sum_j+c)$
可以发现式中存在有同时与 $i$ 和 $j$ 有关的项,可以使用斜率优化。
先将 $\min$ 去掉,并进行移项处理,将原式化为如下形式:
- $a\cdot sum_j^2-b\cdot sum_j+dp_j=2a\cdot sum_i\cdot sum_j-a\cdot sum_i^2-b\cdot sum_i-c+dp_i$
可以看作是一条斜率为 $2a*sum_i$ 的直线,而我们要做的是让纵截距最大。
因为斜率递减( $a<0$ ),而且维护最大值,考虑维护一个上凸壳。
每次将斜率小于当前斜率的出队,每次用队首元素更新。
入队时,保证上凸壳的斜率是单调递减的即可。
Code
1 |
|
总结
今天写到一半,结果老师突然来考试。。。
最后写的有点水,以后想起来再更吧。。